{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "current_dir=/home/rafael/anaconda3/envs/ml2/lib/python3.7/site-packages/pybullet_envs/bullet\n",
      "device:  cpu\n",
      "urdf_root=/home/rafael/anaconda3/envs/ml2/lib/python3.7/site-packages/pybullet_data\n",
      "max_steps:  1000\n",
      "device:  cpu\n",
      "leraning rate:  0.0001\n",
      "state_dim:  28 , action_dim:  8\n",
      "threshold:  15.0\n"
     ]
    }
   ],
   "source": [
    "import gym\n",
    "import pybullet_envs\n",
    "import pybullet_envs.bullet as bul\n",
    "import numpy as np\n",
    "import torch\n",
    "from sac_agent import soft_actor_critic_agent, device\n",
    "from replay_memory import ReplayMemory\n",
    "\n",
    "seed=0  \n",
    "env = gym.make('MinitaurBulletEnv-v0')\n",
    "torch.manual_seed(seed)\n",
    "np.random.seed(seed)\n",
    "env.seed(seed)\n",
    "max_steps = env._max_episode_steps\n",
    "print('max_steps: ', max_steps)\n",
    "\n",
    "batch_size=128 ##  512 \n",
    "LEARNING_RATE=0.0001 \n",
    "start_steps=10000 ## Steps sampling random actions\n",
    "replay_size=1000000 ## size of replay buffer\n",
    "\n",
    "agent = soft_actor_critic_agent(env.observation_space.shape[0], env.action_space, \\\n",
    "        hidden_size=256, seed=seed, lr=LEARNING_RATE, gamma=0.99, tau=0.005, alpha=0.2)\n",
    "\n",
    "memory = ReplayMemory(replay_size)\n",
    "\n",
    "print('device: ', device)\n",
    "print('leraning rate: ', LEARNING_RATE)\n",
    "\n",
    "state_dim = env.observation_space.shape[0]\n",
    "action_dim = env.action_space.shape[0]\n",
    "\n",
    "print('state_dim: ',state_dim, ', action_dim: ', action_dim)\n",
    "\n",
    "threshold = env.spec.reward_threshold\n",
    "print('threshold: ', threshold)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def save(agent, directory, filename, episode, reward):\n",
    "    torch.save(agent.policy.state_dict(), '%s/%s_actor_%s_%s.pth' % (directory, filename, episode, reward))\n",
    "    torch.save(agent.critic.state_dict(), '%s/%s_critic_%s_%s.pth' % (directory, filename, episode, reward))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ep.: 10, Tot.St.: 7832, Avg.Num.St.: 712.0, Min-Max.Sc.: (-2.21, -0.14), Avg.Score: -1.176, Time: 00:10:37\n",
      "Ep.: 20, Tot.St.: 12095, Avg.Num.St.: 576.0, Min-Max.Sc.: (-2.21, 0.02), Avg.Score: -0.947, Time: 00:16:30\n",
      "Ep.: 30, Tot.St.: 15778, Avg.Num.St.: 509.0, Min-Max.Sc.: (-2.46, 0.02), Avg.Score: -0.940, Time: 00:21:37\n",
      "Ep.: 40, Tot.St.: 17901, Avg.Num.St.: 436.6, Min-Max.Sc.: (-2.46, 0.02), Avg.Score: -0.841, Time: 00:24:36\n",
      "Ep.: 50, Tot.St.: 20430, Avg.Num.St.: 400.6, Min-Max.Sc.: (-2.46, 0.02), Avg.Score: -0.731, Time: 00:28:11\n",
      "Ep.: 60, Tot.St.: 23286, Avg.Num.St.: 381.7, Min-Max.Sc.: (-2.46, 0.08), Avg.Score: -0.671, Time: 00:32:11\n",
      "Ep.: 70, Tot.St.: 24355, Avg.Num.St.: 343.0, Min-Max.Sc.: (-2.46, 0.08), Avg.Score: -0.604, Time: 00:33:43\n",
      "Ep.: 80, Tot.St.: 25623, Avg.Num.St.: 316.3, Min-Max.Sc.: (-2.46, 0.15), Avg.Score: -0.553, Time: 00:35:31\n",
      "Ep.: 90, Tot.St.: 27202, Avg.Num.St.: 298.9, Min-Max.Sc.: (-2.46, 0.15), Avg.Score: -0.529, Time: 00:37:44\n",
      "Ep.: 100, Tot.St.: 29489, Avg.Num.St.: 292.2, Min-Max.Sc.: (-2.46, 0.15), Avg.Score: -0.522, Time: 00:40:56\n",
      "Ep.: 110, Tot.St.: 31123, Avg.Num.St.: 232.9, Min-Max.Sc.: (-2.46, 0.15), Avg.Score: -0.447, Time: 00:43:14\n",
      "Ep.: 120, Tot.St.: 32098, Avg.Num.St.: 200.0, Min-Max.Sc.: (-2.46, 0.15), Avg.Score: -0.411, Time: 00:44:38\n",
      "Ep.: 130, Tot.St.: 34010, Avg.Num.St.: 182.3, Min-Max.Sc.: (-2.11, 0.15), Avg.Score: -0.383, Time: 00:47:19\n",
      "Ep.: 140, Tot.St.: 35262, Avg.Num.St.: 173.6, Min-Max.Sc.: (-2.11, 0.15), Avg.Score: -0.351, Time: 00:49:06\n",
      "Ep.: 150, Tot.St.: 37275, Avg.Num.St.: 168.4, Min-Max.Sc.: (-3.29, 0.15), Avg.Score: -0.371, Time: 00:51:55\n",
      "Ep.: 160, Tot.St.: 41063, Avg.Num.St.: 177.8, Min-Max.Sc.: (-4.01, 0.15), Avg.Score: -0.421, Time: 00:57:10\n",
      "Ep.: 170, Tot.St.: 43577, Avg.Num.St.: 192.2, Min-Max.Sc.: (-4.01, 0.15), Avg.Score: -0.475, Time: 01:00:41\n",
      "Ep.: 180, Tot.St.: 45516, Avg.Num.St.: 198.9, Min-Max.Sc.: (-4.01, 0.09), Avg.Score: -0.496, Time: 01:03:24\n",
      "Ep.: 190, Tot.St.: 47244, Avg.Num.St.: 200.4, Min-Max.Sc.: (-4.01, 0.09), Avg.Score: -0.490, Time: 01:05:50\n",
      "Ep.: 200, Tot.St.: 49611, Avg.Num.St.: 201.2, Min-Max.Sc.: (-4.01, 0.09), Avg.Score: -0.481, Time: 01:09:09\n",
      "Ep.: 210, Tot.St.: 51809, Avg.Num.St.: 206.9, Min-Max.Sc.: (-4.01, 0.09), Avg.Score: -0.491, Time: 01:12:13\n",
      "Ep.: 220, Tot.St.: 54347, Avg.Num.St.: 222.5, Min-Max.Sc.: (-4.01, 0.09), Avg.Score: -0.509, Time: 01:15:57\n",
      "Ep.: 230, Tot.St.: 57886, Avg.Num.St.: 238.8, Min-Max.Sc.: (-4.01, 0.38), Avg.Score: -0.507, Time: 01:20:55\n",
      "Ep.: 240, Tot.St.: 60409, Avg.Num.St.: 251.5, Min-Max.Sc.: (-4.01, 0.38), Avg.Score: -0.528, Time: 01:24:26\n",
      "Ep.: 250, Tot.St.: 62682, Avg.Num.St.: 254.1, Min-Max.Sc.: (-4.01, 0.38), Avg.Score: -0.526, Time: 01:27:37\n",
      "Ep.: 260, Tot.St.: 64901, Avg.Num.St.: 238.4, Min-Max.Sc.: (-2.20, 0.38), Avg.Score: -0.486, Time: 01:30:44\n",
      "Ep.: 270, Tot.St.: 68757, Avg.Num.St.: 251.8, Min-Max.Sc.: (-4.16, 0.38), Avg.Score: -0.525, Time: 01:36:08\n",
      "Ep.: 280, Tot.St.: 70839, Avg.Num.St.: 253.2, Min-Max.Sc.: (-4.16, 0.38), Avg.Score: -0.539, Time: 01:39:04\n",
      "Ep.: 290, Tot.St.: 73497, Avg.Num.St.: 262.5, Min-Max.Sc.: (-4.16, 0.38), Avg.Score: -0.535, Time: 01:42:49\n",
      "Ep.: 300, Tot.St.: 77542, Avg.Num.St.: 279.3, Min-Max.Sc.: (-4.16, 0.38), Avg.Score: -0.610, Time: 01:48:28\n",
      "Ep.: 310, Tot.St.: 80768, Avg.Num.St.: 289.6, Min-Max.Sc.: (-4.16, 0.38), Avg.Score: -0.629, Time: 01:52:59\n",
      "Ep.: 320, Tot.St.: 82523, Avg.Num.St.: 281.8, Min-Max.Sc.: (-4.16, 0.38), Avg.Score: -0.598, Time: 01:55:27\n",
      "Ep.: 330, Tot.St.: 86146, Avg.Num.St.: 282.6, Min-Max.Sc.: (-4.16, 0.38), Avg.Score: -0.577, Time: 02:00:31\n",
      "Ep.: 340, Tot.St.: 88834, Avg.Num.St.: 284.2, Min-Max.Sc.: (-4.16, 0.35), Avg.Score: -0.553, Time: 02:04:17\n",
      "Ep.: 350, Tot.St.: 91642, Avg.Num.St.: 289.6, Min-Max.Sc.: (-4.16, 0.35), Avg.Score: -0.566, Time: 02:08:13\n",
      "Ep.: 360, Tot.St.: 97237, Avg.Num.St.: 323.4, Min-Max.Sc.: (-4.16, 0.35), Avg.Score: -0.606, Time: 02:16:00\n",
      "Ep.: 370, Tot.St.: 99654, Avg.Num.St.: 309.0, Min-Max.Sc.: (-2.60, 0.35), Avg.Score: -0.534, Time: 02:19:24\n",
      "Ep.: 380, Tot.St.: 101919, Avg.Num.St.: 310.8, Min-Max.Sc.: (-2.60, 0.35), Avg.Score: -0.536, Time: 02:22:37\n",
      "Ep.: 390, Tot.St.: 105059, Avg.Num.St.: 315.6, Min-Max.Sc.: (-2.60, 0.35), Avg.Score: -0.572, Time: 02:27:02\n",
      "Ep.: 400, Tot.St.: 108583, Avg.Num.St.: 310.4, Min-Max.Sc.: (-2.60, 0.64), Avg.Score: -0.470, Time: 02:31:59\n",
      "Ep.: 410, Tot.St.: 112306, Avg.Num.St.: 315.4, Min-Max.Sc.: (-2.60, 0.64), Avg.Score: -0.407, Time: 02:37:19\n",
      "Ep.: 420, Tot.St.: 115627, Avg.Num.St.: 331.0, Min-Max.Sc.: (-2.60, 1.92), Avg.Score: -0.339, Time: 02:42:01\n",
      "Ep.: 430, Tot.St.: 116981, Avg.Num.St.: 308.4, Min-Max.Sc.: (-2.60, 1.92), Avg.Score: -0.285, Time: 02:43:56\n",
      "Ep.: 440, Tot.St.: 119083, Avg.Num.St.: 302.5, Min-Max.Sc.: (-2.60, 1.92), Avg.Score: -0.248, Time: 02:46:55\n",
      "Ep.: 450, Tot.St.: 121267, Avg.Num.St.: 296.2, Min-Max.Sc.: (-2.60, 1.92), Avg.Score: -0.173, Time: 02:50:00\n",
      "Ep.: 460, Tot.St.: 124361, Avg.Num.St.: 271.2, Min-Max.Sc.: (-2.60, 1.92), Avg.Score: -0.042, Time: 02:54:21\n",
      "Ep.: 470, Tot.St.: 125678, Avg.Num.St.: 260.2, Min-Max.Sc.: (-1.40, 1.92), Avg.Score: 0.013, Time: 02:56:14\n",
      "Ep.: 480, Tot.St.: 128533, Avg.Num.St.: 266.1, Min-Max.Sc.: (-1.40, 1.92), Avg.Score: 0.114, Time: 03:00:18\n",
      "Ep.: 490, Tot.St.: 130399, Avg.Num.St.: 253.4, Min-Max.Sc.: (-0.70, 1.92), Avg.Score: 0.212, Time: 03:02:58\n",
      "Ep.: 500, Tot.St.: 133033, Avg.Num.St.: 244.5, Min-Max.Sc.: (-0.63, 2.40), Avg.Score: 0.321, Time: 03:06:42\n",
      "Ep.: 510, Tot.St.: 134351, Avg.Num.St.: 220.4, Min-Max.Sc.: (-0.13, 2.40), Avg.Score: 0.380, Time: 03:08:36\n",
      "Ep.: 520, Tot.St.: 135604, Avg.Num.St.: 199.8, Min-Max.Sc.: (-0.13, 2.40), Avg.Score: 0.362, Time: 03:10:25\n",
      "Ep.: 530, Tot.St.: 136515, Avg.Num.St.: 195.3, Min-Max.Sc.: (-0.13, 2.40), Avg.Score: 0.382, Time: 03:11:45\n",
      "Ep.: 540, Tot.St.: 137805, Avg.Num.St.: 187.2, Min-Max.Sc.: (-0.13, 2.40), Avg.Score: 0.413, Time: 03:13:37\n",
      "Ep.: 550, Tot.St.: 140266, Avg.Num.St.: 190.0, Min-Max.Sc.: (-0.13, 2.40), Avg.Score: 0.436, Time: 03:17:08\n",
      "Ep.: 560, Tot.St.: 140907, Avg.Num.St.: 165.5, Min-Max.Sc.: (-0.05, 2.40), Avg.Score: 0.405, Time: 03:18:06\n",
      "Ep.: 570, Tot.St.: 142287, Avg.Num.St.: 166.1, Min-Max.Sc.: (-0.04, 2.40), Avg.Score: 0.415, Time: 03:20:07\n",
      "Ep.: 580, Tot.St.: 145494, Avg.Num.St.: 169.6, Min-Max.Sc.: (-0.04, 2.40), Avg.Score: 0.410, Time: 03:24:43\n",
      "Ep.: 590, Tot.St.: 147414, Avg.Num.St.: 170.2, Min-Max.Sc.: (-0.09, 2.40), Avg.Score: 0.384, Time: 03:27:31\n",
      "Ep.: 600, Tot.St.: 148594, Avg.Num.St.: 155.6, Min-Max.Sc.: (-0.09, 1.72), Avg.Score: 0.296, Time: 03:29:16\n",
      "Ep.: 610, Tot.St.: 150960, Avg.Num.St.: 166.1, Min-Max.Sc.: (-0.09, 1.70), Avg.Score: 0.286, Time: 03:32:43\n",
      "Ep.: 620, Tot.St.: 152418, Avg.Num.St.: 168.1, Min-Max.Sc.: (-0.09, 1.70), Avg.Score: 0.289, Time: 03:34:52\n",
      "Ep.: 630, Tot.St.: 154648, Avg.Num.St.: 181.3, Min-Max.Sc.: (-0.09, 1.70), Avg.Score: 0.278, Time: 03:38:13\n",
      "Ep.: 640, Tot.St.: 156933, Avg.Num.St.: 191.3, Min-Max.Sc.: (-0.09, 1.71), Avg.Score: 0.283, Time: 03:41:36\n",
      "Ep.: 650, Tot.St.: 159522, Avg.Num.St.: 192.6, Min-Max.Sc.: (-0.09, 1.84), Avg.Score: 0.310, Time: 03:45:24\n",
      "Ep.: 660, Tot.St.: 160639, Avg.Num.St.: 197.3, Min-Max.Sc.: (-0.09, 1.84), Avg.Score: 0.335, Time: 03:47:04\n",
      "Ep.: 670, Tot.St.: 161699, Avg.Num.St.: 194.1, Min-Max.Sc.: (-0.09, 1.84), Avg.Score: 0.352, Time: 03:48:39\n",
      "Ep.: 680, Tot.St.: 162972, Avg.Num.St.: 174.8, Min-Max.Sc.: (-0.09, 1.84), Avg.Score: 0.358, Time: 03:50:33\n",
      "Ep.: 690, Tot.St.: 164011, Avg.Num.St.: 166.0, Min-Max.Sc.: (-0.03, 1.84), Avg.Score: 0.387, Time: 03:52:07\n",
      "Ep.: 700, Tot.St.: 165003, Avg.Num.St.: 164.1, Min-Max.Sc.: (-0.01, 1.84), Avg.Score: 0.418, Time: 03:53:36\n",
      "Ep.: 710, Tot.St.: 166004, Avg.Num.St.: 150.4, Min-Max.Sc.: (-0.01, 1.84), Avg.Score: 0.426, Time: 03:55:06\n",
      "Ep.: 720, Tot.St.: 167186, Avg.Num.St.: 147.7, Min-Max.Sc.: (-0.01, 1.84), Avg.Score: 0.424, Time: 03:56:54\n",
      "Ep.: 730, Tot.St.: 167859, Avg.Num.St.: 132.1, Min-Max.Sc.: (-0.01, 1.84), Avg.Score: 0.421, Time: 03:57:56\n",
      "Ep.: 740, Tot.St.: 168656, Avg.Num.St.: 117.2, Min-Max.Sc.: (-0.01, 1.84), Avg.Score: 0.405, Time: 03:59:10\n",
      "Ep.: 750, Tot.St.: 169368, Avg.Num.St.: 98.5, Min-Max.Sc.: (-0.01, 1.83), Avg.Score: 0.371, Time: 04:00:16\n",
      "Ep.: 760, Tot.St.: 171200, Avg.Num.St.: 105.6, Min-Max.Sc.: (-0.01, 3.43), Avg.Score: 0.402, Time: 04:03:00\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ep.: 770, Tot.St.: 172948, Avg.Num.St.: 112.5, Min-Max.Sc.: (-0.01, 3.43), Avg.Score: 0.399, Time: 04:05:39\n",
      "Ep.: 780, Tot.St.: 175165, Avg.Num.St.: 121.9, Min-Max.Sc.: (-0.01, 3.43), Avg.Score: 0.389, Time: 04:09:00\n",
      "Ep.: 790, Tot.St.: 176382, Avg.Num.St.: 123.7, Min-Max.Sc.: (0.02, 3.43), Avg.Score: 0.373, Time: 04:10:53\n",
      "Ep.: 800, Tot.St.: 178629, Avg.Num.St.: 136.3, Min-Max.Sc.: (-0.10, 3.43), Avg.Score: 0.388, Time: 04:14:20\n",
      "Ep.: 810, Tot.St.: 180645, Avg.Num.St.: 146.4, Min-Max.Sc.: (-0.10, 3.43), Avg.Score: 0.423, Time: 04:17:26\n",
      "Ep.: 820, Tot.St.: 182318, Avg.Num.St.: 151.3, Min-Max.Sc.: (-0.10, 3.43), Avg.Score: 0.469, Time: 04:20:00\n",
      "Ep.: 830, Tot.St.: 183691, Avg.Num.St.: 158.3, Min-Max.Sc.: (-0.10, 3.43), Avg.Score: 0.515, Time: 04:22:09\n",
      "Ep.: 840, Tot.St.: 185324, Avg.Num.St.: 166.7, Min-Max.Sc.: (-0.10, 3.43), Avg.Score: 0.541, Time: 04:24:40\n",
      "Ep.: 850, Tot.St.: 186193, Avg.Num.St.: 168.2, Min-Max.Sc.: (-0.10, 3.43), Avg.Score: 0.550, Time: 04:26:04\n",
      "Ep.: 860, Tot.St.: 187015, Avg.Num.St.: 158.2, Min-Max.Sc.: (-0.10, 3.43), Avg.Score: 0.517, Time: 04:27:22\n",
      "Ep.: 870, Tot.St.: 187908, Avg.Num.St.: 149.6, Min-Max.Sc.: (-0.10, 3.43), Avg.Score: 0.523, Time: 04:28:47\n",
      "Ep.: 880, Tot.St.: 188542, Avg.Num.St.: 133.8, Min-Max.Sc.: (-0.10, 3.43), Avg.Score: 0.521, Time: 04:29:48\n",
      "Ep.: 890, Tot.St.: 189226, Avg.Num.St.: 128.4, Min-Max.Sc.: (-0.10, 3.43), Avg.Score: 0.532, Time: 04:30:54\n",
      "Ep.: 900, Tot.St.: 189913, Avg.Num.St.: 112.8, Min-Max.Sc.: (-0.00, 3.43), Avg.Score: 0.507, Time: 04:32:00\n",
      "Ep.: 910, Tot.St.: 190511, Avg.Num.St.: 98.7, Min-Max.Sc.: (-0.00, 3.43), Avg.Score: 0.462, Time: 04:32:59\n",
      "Ep.: 920, Tot.St.: 192604, Avg.Num.St.: 102.9, Min-Max.Sc.: (-0.00, 3.43), Avg.Score: 0.431, Time: 04:36:22\n",
      "Ep.: 930, Tot.St.: 193981, Avg.Num.St.: 102.9, Min-Max.Sc.: (-0.00, 3.43), Avg.Score: 0.383, Time: 04:38:33\n",
      "Ep.: 940, Tot.St.: 197590, Avg.Num.St.: 122.7, Min-Max.Sc.: (-0.00, 2.38), Avg.Score: 0.409, Time: 04:44:12\n",
      "Ep.: 950, Tot.St.: 200291, Avg.Num.St.: 141.0, Min-Max.Sc.: (-0.00, 2.38), Avg.Score: 0.455, Time: 04:48:26\n",
      "Ep.: 960, Tot.St.: 202646, Avg.Num.St.: 156.3, Min-Max.Sc.: (0.07, 2.38), Avg.Score: 0.490, Time: 04:52:08\n",
      "Ep.: 970, Tot.St.: 204196, Avg.Num.St.: 162.9, Min-Max.Sc.: (0.07, 2.38), Avg.Score: 0.525, Time: 04:54:36\n",
      "Ep.: 980, Tot.St.: 205253, Avg.Num.St.: 167.1, Min-Max.Sc.: (0.07, 2.91), Avg.Score: 0.556, Time: 04:56:18\n",
      "Ep.: 990, Tot.St.: 207574, Avg.Num.St.: 183.5, Min-Max.Sc.: (0.07, 4.05), Avg.Score: 0.647, Time: 04:59:59\n",
      "Ep.: 1000, Tot.St.: 208373, Avg.Num.St.: 184.6, Min-Max.Sc.: (0.07, 4.05), Avg.Score: 0.658, Time: 05:01:17\n",
      "Ep.: 1010, Tot.St.: 212150, Avg.Num.St.: 216.4, Min-Max.Sc.: (0.07, 5.73), Avg.Score: 0.819, Time: 05:07:13\n",
      "Ep.: 1020, Tot.St.: 213874, Avg.Num.St.: 212.7, Min-Max.Sc.: (0.07, 5.73), Avg.Score: 0.884, Time: 05:09:58\n",
      "Ep.: 1030, Tot.St.: 217364, Avg.Num.St.: 233.8, Min-Max.Sc.: (0.08, 6.30), Avg.Score: 1.071, Time: 05:15:28\n",
      "Ep.: 1040, Tot.St.: 220863, Avg.Num.St.: 232.7, Min-Max.Sc.: (0.09, 6.30), Avg.Score: 1.145, Time: 05:21:00\n",
      "Ep.: 1050, Tot.St.: 223624, Avg.Num.St.: 233.3, Min-Max.Sc.: (0.09, 6.30), Avg.Score: 1.207, Time: 05:25:23\n",
      "Ep.: 1060, Tot.St.: 225563, Avg.Num.St.: 229.2, Min-Max.Sc.: (0.10, 6.30), Avg.Score: 1.236, Time: 05:28:29\n",
      "Ep.: 1070, Tot.St.: 228140, Avg.Num.St.: 239.4, Min-Max.Sc.: (0.10, 6.30), Avg.Score: 1.290, Time: 05:32:35\n",
      "Ep.: 1080, Tot.St.: 229195, Avg.Num.St.: 239.4, Min-Max.Sc.: (0.13, 6.30), Avg.Score: 1.290, Time: 05:34:18\n",
      "Ep.: 1090, Tot.St.: 231183, Avg.Num.St.: 236.1, Min-Max.Sc.: (0.13, 6.30), Avg.Score: 1.263, Time: 05:37:29\n",
      "Ep.: 1100, Tot.St.: 232145, Avg.Num.St.: 237.7, Min-Max.Sc.: (0.13, 6.30), Avg.Score: 1.269, Time: 05:39:03\n",
      "Ep.: 1110, Tot.St.: 233843, Avg.Num.St.: 216.9, Min-Max.Sc.: (0.13, 6.30), Avg.Score: 1.163, Time: 05:41:47\n",
      "Ep.: 1120, Tot.St.: 234998, Avg.Num.St.: 211.2, Min-Max.Sc.: (0.13, 6.30), Avg.Score: 1.109, Time: 05:43:46\n",
      "Ep.: 1130, Tot.St.: 236366, Avg.Num.St.: 190.0, Min-Max.Sc.: (0.15, 6.21), Avg.Score: 0.963, Time: 05:46:01\n",
      "Ep.: 1140, Tot.St.: 237394, Avg.Num.St.: 165.3, Min-Max.Sc.: (0.15, 6.21), Avg.Score: 0.858, Time: 05:47:42\n",
      "Ep.: 1150, Tot.St.: 239724, Avg.Num.St.: 161.0, Min-Max.Sc.: (0.15, 6.21), Avg.Score: 0.842, Time: 05:51:27\n",
      "Ep.: 1160, Tot.St.: 241607, Avg.Num.St.: 160.4, Min-Max.Sc.: (0.15, 6.21), Avg.Score: 0.836, Time: 05:54:29\n",
      "Ep.: 1170, Tot.St.: 244157, Avg.Num.St.: 160.2, Min-Max.Sc.: (0.15, 6.16), Avg.Score: 0.839, Time: 05:58:32\n",
      "Ep.: 1180, Tot.St.: 246938, Avg.Num.St.: 177.4, Min-Max.Sc.: (0.15, 6.16), Avg.Score: 0.903, Time: 06:03:00\n",
      "Ep.: 1190, Tot.St.: 249491, Avg.Num.St.: 183.1, Min-Max.Sc.: (0.15, 6.16), Avg.Score: 0.936, Time: 06:07:04\n",
      "Ep.: 1200, Tot.St.: 253450, Avg.Num.St.: 213.1, Min-Max.Sc.: (0.15, 6.16), Avg.Score: 1.093, Time: 06:13:52\n",
      "Ep.: 1210, Tot.St.: 257190, Avg.Num.St.: 233.5, Min-Max.Sc.: (0.15, 7.93), Avg.Score: 1.253, Time: 06:23:31\n",
      "Ep.: 1220, Tot.St.: 259370, Avg.Num.St.: 243.7, Min-Max.Sc.: (0.15, 7.93), Avg.Score: 1.309, Time: 06:29:32\n",
      "Ep.: 1230, Tot.St.: 263137, Avg.Num.St.: 267.7, Min-Max.Sc.: (0.16, 7.93), Avg.Score: 1.482, Time: 06:39:50\n",
      "Ep.: 1240, Tot.St.: 267894, Avg.Num.St.: 305.0, Min-Max.Sc.: (0.16, 7.93), Avg.Score: 1.704, Time: 06:52:50\n",
      "Ep.: 1250, Tot.St.: 275709, Avg.Num.St.: 359.9, Min-Max.Sc.: (0.16, 7.93), Avg.Score: 2.090, Time: 07:14:16\n",
      "Ep.: 1260, Tot.St.: 281599, Avg.Num.St.: 399.9, Min-Max.Sc.: (0.13, 7.93), Avg.Score: 2.358, Time: 07:30:31\n",
      "Ep.: 1270, Tot.St.: 285059, Avg.Num.St.: 409.0, Min-Max.Sc.: (0.13, 7.93), Avg.Score: 2.456, Time: 07:40:05\n",
      "Ep.: 1280, Tot.St.: 287976, Avg.Num.St.: 410.4, Min-Max.Sc.: (0.13, 7.93), Avg.Score: 2.498, Time: 07:48:09\n",
      "Ep.: 1290, Tot.St.: 295687, Avg.Num.St.: 462.0, Min-Max.Sc.: (0.13, 10.27), Avg.Score: 2.903, Time: 08:09:22\n",
      "Ep.: 1300, Tot.St.: 303345, Avg.Num.St.: 498.9, Min-Max.Sc.: (0.13, 10.27), Avg.Score: 3.185, Time: 08:30:35\n",
      "Ep.: 1310, Tot.St.: 310688, Avg.Num.St.: 535.0, Min-Max.Sc.: (0.13, 10.27), Avg.Score: 3.422, Time: 08:50:52\n",
      "Ep.: 1320, Tot.St.: 315355, Avg.Num.St.: 559.9, Min-Max.Sc.: (0.13, 10.27), Avg.Score: 3.677, Time: 09:04:04\n",
      "Ep.: 1330, Tot.St.: 321354, Avg.Num.St.: 582.2, Min-Max.Sc.: (0.13, 10.27), Avg.Score: 3.917, Time: 09:20:44\n",
      "Ep.: 1340, Tot.St.: 328057, Avg.Num.St.: 601.6, Min-Max.Sc.: (0.13, 10.35), Avg.Score: 4.127, Time: 09:39:21\n",
      "Ep.: 1350, Tot.St.: 334546, Avg.Num.St.: 588.4, Min-Max.Sc.: (0.13, 10.35), Avg.Score: 4.177, Time: 09:57:23\n",
      "Ep.: 1360, Tot.St.: 339202, Avg.Num.St.: 576.0, Min-Max.Sc.: (0.15, 12.03), Avg.Score: 4.326, Time: 10:10:34\n",
      "Ep.: 1370, Tot.St.: 342730, Avg.Num.St.: 576.7, Min-Max.Sc.: (0.15, 12.03), Avg.Score: 4.496, Time: 10:20:22\n",
      "Ep.: 1380, Tot.St.: 344733, Avg.Num.St.: 567.6, Min-Max.Sc.: (0.21, 12.03), Avg.Score: 4.512, Time: 10:25:59\n",
      "Ep.: 1390, Tot.St.: 346341, Avg.Num.St.: 506.5, Min-Max.Sc.: (0.21, 12.03), Avg.Score: 4.174, Time: 10:30:39\n",
      "Ep.: 1400, Tot.St.: 349250, Avg.Num.St.: 459.1, Min-Max.Sc.: (0.21, 12.03), Avg.Score: 4.021, Time: 10:38:51\n",
      "Ep.: 1410, Tot.St.: 350965, Avg.Num.St.: 402.8, Min-Max.Sc.: (0.21, 12.03), Avg.Score: 3.745, Time: 10:43:41\n",
      "Ep.: 1420, Tot.St.: 353102, Avg.Num.St.: 377.5, Min-Max.Sc.: (0.27, 12.03), Avg.Score: 3.652, Time: 10:49:42\n",
      "Ep.: 1430, Tot.St.: 354900, Avg.Num.St.: 335.5, Min-Max.Sc.: (0.25, 12.03), Avg.Score: 3.338, Time: 10:54:52\n",
      "Ep.: 1440, Tot.St.: 358084, Avg.Num.St.: 300.3, Min-Max.Sc.: (0.25, 12.03), Avg.Score: 3.265, Time: 11:03:47\n",
      "Ep.: 1450, Tot.St.: 361157, Avg.Num.St.: 266.1, Min-Max.Sc.: (0.17, 13.28), Avg.Score: 3.053, Time: 11:12:22\n",
      "Ep.: 1460, Tot.St.: 365748, Avg.Num.St.: 265.5, Min-Max.Sc.: (0.17, 13.28), Avg.Score: 3.062, Time: 11:25:09\n",
      "Ep.: 1470, Tot.St.: 368531, Avg.Num.St.: 258.0, Min-Max.Sc.: (0.17, 13.28), Avg.Score: 3.031, Time: 11:32:56\n",
      "Ep.: 1480, Tot.St.: 370922, Avg.Num.St.: 261.9, Min-Max.Sc.: (0.17, 13.28), Avg.Score: 3.054, Time: 11:39:40\n",
      "Ep.: 1490, Tot.St.: 374260, Avg.Num.St.: 279.2, Min-Max.Sc.: (0.17, 13.28), Avg.Score: 3.219, Time: 11:49:02\n",
      "Ep.: 1500, Tot.St.: 378933, Avg.Num.St.: 296.8, Min-Max.Sc.: (0.17, 13.28), Avg.Score: 3.434, Time: 12:02:05\n",
      "Ep.: 1510, Tot.St.: 381805, Avg.Num.St.: 308.4, Min-Max.Sc.: (0.17, 13.28), Avg.Score: 3.597, Time: 12:10:07\n",
      "Ep.: 1520, Tot.St.: 386797, Avg.Num.St.: 336.9, Min-Max.Sc.: (0.17, 13.80), Avg.Score: 3.984, Time: 12:24:01\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ep.: 1530, Tot.St.: 390128, Avg.Num.St.: 352.3, Min-Max.Sc.: (0.17, 13.80), Avg.Score: 4.241, Time: 12:33:21\n",
      "Ep.: 1540, Tot.St.: 395124, Avg.Num.St.: 370.4, Min-Max.Sc.: (0.17, 14.64), Avg.Score: 4.577, Time: 12:47:15\n",
      "Ep.: 1550, Tot.St.: 399625, Avg.Num.St.: 384.7, Min-Max.Sc.: (0.22, 15.60), Avg.Score: 4.930, Time: 12:59:45\n",
      "Ep.: 1560, Tot.St.: 406670, Avg.Num.St.: 409.2, Min-Max.Sc.: (0.22, 18.37), Avg.Score: 5.570, Time: 13:19:25\n",
      "Ep.: 1570, Tot.St.: 413715, Avg.Num.St.: 451.8, Min-Max.Sc.: (0.22, 18.37), Avg.Score: 6.319, Time: 13:39:07\n",
      "Ep.: 1580, Tot.St.: 419703, Avg.Num.St.: 487.8, Min-Max.Sc.: (0.22, 18.37), Avg.Score: 7.091, Time: 13:55:53\n",
      "Ep.: 1590, Tot.St.: 426830, Avg.Num.St.: 525.7, Min-Max.Sc.: (0.22, 20.79), Avg.Score: 8.002, Time: 14:15:46\n",
      "Ep.: 1600, Tot.St.: 436015, Avg.Num.St.: 570.8, Min-Max.Sc.: (0.22, 20.79), Avg.Score: 9.178, Time: 14:41:30\n",
      "Ep.: 1610, Tot.St.: 445347, Avg.Num.St.: 635.4, Min-Max.Sc.: (0.22, 20.80), Avg.Score: 10.602, Time: 15:07:38\n",
      "Ep.: 1620, Tot.St.: 454097, Avg.Num.St.: 673.0, Min-Max.Sc.: (0.22, 20.80), Avg.Score: 11.515, Time: 15:32:18\n",
      "Ep.: 1630, Tot.St.: 460357, Avg.Num.St.: 702.3, Min-Max.Sc.: (0.08, 20.80), Avg.Score: 12.129, Time: 15:49:57\n",
      "Ep.: 1640, Tot.St.: 465948, Avg.Num.St.: 708.2, Min-Max.Sc.: (0.04, 20.80), Avg.Score: 12.383, Time: 16:05:40\n",
      "Ep.: 1650, Tot.St.: 471914, Avg.Num.St.: 722.9, Min-Max.Sc.: (0.04, 20.80), Avg.Score: 12.748, Time: 16:22:26\n",
      "Ep.: 1660, Tot.St.: 479254, Avg.Num.St.: 725.8, Min-Max.Sc.: (0.04, 20.80), Avg.Score: 12.911, Time: 16:43:16\n",
      "Ep.: 1670, Tot.St.: 489093, Avg.Num.St.: 753.8, Min-Max.Sc.: (0.04, 20.80), Avg.Score: 13.621, Time: 17:11:46\n",
      "Ep.: 1680, Tot.St.: 497313, Avg.Num.St.: 776.1, Min-Max.Sc.: (0.04, 21.44), Avg.Score: 14.260, Time: 17:35:09\n",
      "Ep.: 1690, Tot.St.: 505945, Avg.Num.St.: 791.1, Min-Max.Sc.: (0.04, 21.44), Avg.Score: 14.479, Time: 17:59:44\n",
      "Ep.: 1700, Tot.St.: 514981, Avg.Num.St.: 789.7, Min-Max.Sc.: (0.04, 21.44), Avg.Score: 14.473, Time: 18:25:31\n",
      "Ep.: 1710, Tot.St.: 522821, Avg.Num.St.: 774.7, Min-Max.Sc.: (0.04, 22.46), Avg.Score: 14.205, Time: 18:47:56\n",
      "Ep.: 1720, Tot.St.: 530160, Avg.Num.St.: 760.6, Min-Max.Sc.: (0.04, 22.51), Avg.Score: 14.020, Time: 19:09:32\n",
      "Ep.: 1730, Tot.St.: 538166, Avg.Num.St.: 778.1, Min-Max.Sc.: (0.04, 22.51), Avg.Score: 14.498, Time: 19:33:12\n",
      "Ep.: 1740, Tot.St.: 545961, Avg.Num.St.: 800.1, Min-Max.Sc.: (0.04, 22.51), Avg.Score: 14.872, Time: 19:56:14\n",
      "Solved environment with Avg Score:   15.097705826385656\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "from  collections  import deque\n",
    "\n",
    "def sac_train(max_steps):\n",
    "\n",
    "    total_numsteps = 0\n",
    "    updates = 0\n",
    "    num_episodes = 40000\n",
    "    updates=0\n",
    "\n",
    "    time_start = time.time()\n",
    "    scores_deque = deque(maxlen=100)\n",
    "    scores_array = []\n",
    "    avg_scores_array = [] \n",
    "    num_steps_deque = deque(maxlen=100)\n",
    "    avg_numm_steps_array = []\n",
    "    \n",
    "    for i_episode in range(num_episodes): \n",
    "        episode_reward = 0\n",
    "        episode_steps = 0\n",
    "        done = False\n",
    "        state = env.reset()\n",
    "\n",
    "        for step in range(max_steps):    \n",
    "            if start_steps > total_numsteps:\n",
    "                action = env.action_space.sample()  # Sample random action\n",
    "            else:\n",
    "                action = agent.select_action(state)  # Sample action from policy\n",
    "\n",
    "            if len(memory) > batch_size:\n",
    "                \n",
    "                # Update parameters of all the networks\n",
    "                agent.update_parameters(memory, batch_size, updates)\n",
    "\n",
    "                updates += 1\n",
    "\n",
    "            next_state, reward, done, _ = env.step(action) # Step\n",
    "            episode_steps += 1\n",
    "            total_numsteps += 1\n",
    "            episode_reward += reward\n",
    "\n",
    "            mask = 1 if episode_steps == env._max_episode_steps else float(not done)\n",
    "\n",
    "            memory.push(state, action, reward, next_state, mask) # Append transition to memory\n",
    "\n",
    "            state = next_state\n",
    "            \n",
    "            if done:\n",
    "                break\n",
    "\n",
    "        scores_deque.append(episode_reward)\n",
    "        scores_array.append(episode_reward)        \n",
    "        avg_score = np.mean(scores_deque)\n",
    "        avg_scores_array.append(avg_score)\n",
    "        min_score = np.min(scores_deque)\n",
    "        max_score = np.max(scores_deque)\n",
    "        num_steps_deque.append(episode_steps)\n",
    "        avg_num_steps = np.mean(num_steps_deque)\n",
    "        avg_numm_steps_array.append(avg_num_steps)\n",
    "        \n",
    "        \n",
    "        if i_episode % 500 == 0 and i_episode > 0:\n",
    "            reward_round = round(episode_reward, 2)\n",
    "            save(agent, 'dir_lr0.0001', 'weights', str(i_episode), str(reward_round))\n",
    "\n",
    "        s =  (int)(time.time() - time_start)\n",
    "          \n",
    "        if i_episode % 10 == 0 and i_episode > 0:  \n",
    "\n",
    "            print(\"Ep.: {}, Tot.St.: {}, Avg.Num.St.: {:.1f}, Min-Max.Sc.: ({:.2f}, {:.2f}), Avg.Score: {:.3f}, Time: {:02}:{:02}:{:02}\".\\\n",
    "                format(i_episode, total_numsteps, avg_num_steps, min_score, max_score, avg_score, \\\n",
    "                  s//3600, s%3600//60, s%60))\n",
    "\n",
    "                    \n",
    "        if (avg_score >= threshold):            \n",
    "            print('Solved environment with Avg Score:  ', avg_score)\n",
    "            \n",
    "            break;\n",
    "            \n",
    "    return scores_array, avg_scores_array, avg_numm_steps_array \n",
    "\n",
    "scores, avg_scores, avg_numm_steps = sac_train(max_steps=max_steps)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "reward_round = round(np.max(scores), 2)\n",
    "save(agent, 'dir_lr0.0001', 'weights', 'final', str(reward_round))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "length of scores:  1745 , len of avg_scores:  1745\n"
     ]
    },
    {
     "data": {
      "image/png": "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IT2b+VtyAdhXVG+BYtFEn3zySfwRRxxR+t5778UHor7HHnusW7du3awZGRkbt27duuGtt97KjIyMbNKAL6vVGojQGjR16tTCpUuXbqp7/IUXXugaGxtr27179/qbbrop5+9//3tvgJUrV7b78ssv47ds2bLhp59+yrjtttv62my2Jsdx99135950000Hm1xRM2iO7NYG3KG1HgaMA25USg0D7gF+1VoPBn51PhdCiLCnXC1Bhq6e8p6RU8qSHfn1yv7tw1X886v0Zo2vrSgqKjItX76849tvv5351VdfxQN88cUXMZMnTx7gKvPdd991OuGEEwYBPPfcc12TkpJGjBw5cuhFF13U74orruhbt87s7OyIXr16VWctqampla6VpV966aUuycnJw4YMGTJs6tSp/QG2bNkSOW7cuOTk5ORhxxxzTPLWrVsjAaZNm5Z0ySWX9B01alTKDTfc0HvDhg1Rxx133ODhw4cPHTt27BB3LVc5OTnmk046aWBycvKw1NTUlKVLl0YD/P3vf+95/vnnJx111FFDevfuPfLRRx/t5u5+nHjiiYf69etXL+P67rvvOv/1r389CHDVVVcVLFq0qJNhGHzxxRedzz333Pzo6GidkpJS1a9fv8rff/+9Q93zv/zyy5jRo0enDBs2bOjkyZMHuFrGevXqNfL666/vnZycPGzkyJFD169fH+WK94EHHkgEePTRR7sNHDhweHJy8rAzzjhjgLf3uX//fvOxxx47eNCgQcMvvPDCfjUXc37llVfiR44cOTQlJWXYJZdc0s9ms2Gz2Zg2bVrS4MGDhycnJw/797//7fa+eBP0gdFa62wg2/m4RCm1CegFnA1MchZ7F/gd+Eew4xFCiKY63BIkM8IA+PrGPhzY2D6gdXYbVsbUl71uzPrRRx91njRpUtGoUaMq4+LibAsWLGh/9tlnF9988839iouLTTExMcbHH38cd/755+dnZmZGPP300z1WrVq1sXPnzsb48eOThw8fXl63zhkzZuSdccYZybNnz46bOHFi8bXXXntw5MiRlStWrGj39NNP91i8ePHmHj162HJycswAN9xwQ99LL7304M0333zw+eef73LDDTf0mTt37naA7OzsyFWrVm22WCwcc8wxya+99tqukSNHVv72228dbrjhhr5LliyptWnc3Xff3TM1NbVs7ty527/55ptO06dP77958+aNANu2bWu3aNGiLYWFheahQ4eOuOuuu3KjoqJ8+geYk5MT2b9//yqAiIgIOnbsaM/JybFkZWVFjhs3rtRVrmfPnlV79uyJBA65jmVnZ1see+yxHn/88UdGTEyMcd9993V/5JFHEp9++ulsgNjYWFtGRsbGl156qcvNN9/cp+4WIy+++GL3Xbt2pUdHR+u8vDyzt/d5zz339DzmmGNKn3766exPPvkk9rPPPusKsGrVqnZffPFF/IoVKzZHRUXpyy67rO/MmTO7pKamlmdnZ0ds3bp1A4Crfn80az+nUioJGAMsBRKdCRLAfiDRwzkzlFIrlFIrcnNzmydQIYTwwjUmKPNgmdvXy6pslFfZmzOkNumzzz6Lv/jiiwsApk2blv/+++/HR0REMGnSpOJPPvkk1mq18ttvv8VefPHFhQsWLOhw9NFHlyQmJtqjoqL0OeecU+CuzvHjx5fv3Lkz/fbbb9+fn59vGT9+/NBVq1a1mzNnTsyZZ55Z0KNHDxtAYmKiHWD16tUdZsyYkQ9www035K9cubKjq65zzz23wGKxUFRUZFq9enXH888/f2BKSsqwv/3tb/0OHDhQbyrhsmXLOl199dUHAc4666ySwsJCS35+vgnglFNOKYyOjtY9evSwxcfHW/fu3dsss7t///33Dtu3b2931FFHpaSkpAz75JNPuuzevbt6TNH06dPzAa699tr81atXd6x7/pAhQ8rPOeec/q+88kp8RESE9vY+lyxZ0snVYnXRRRcVxcTE2AF++umnTuvXr2+fmpo6NCUlZdjChQtjduzYEZWSklK5Z8+eqOnTp/f54osvYuLi4vz+T9dsU+SVUh2BWcBtWutiVWN2hdZaK6XcZrRa69eA18Cxd1hzxCqEEN7UnB3mzrAH5hAdYWbTI6cF5HpvLNjBNccNaLhgqDTQYhMMOTk55iVLlnTasmVL9E033YTdbldKKW0Yxt6LL744/6WXXurWtWtX+8iRI8vi4uI8T91zIzY21pg+fXrh9OnTC6+44gpmz54d25hxQR07djQA7HY7nTp1srladRqjZquP2WzGZrP5PMw+MTGxaufOnZEDBw60Wq1WSktLzYmJibZevXq5Wn4A2LdvX2SfPn2qap6rtWbChAnF33777U53dZtMh9tS3H2Oz5s3b+uPP/7Yafbs2bFPP/10jy1btmzwNe4aMajzzz//4Msvv5xV97X169dv/Oqrr2JmzpyZ8Omnn8Z//vnnmf7U3SwtQUqpCBwJ0Ida6y+dh3OUUj2cr/cADjRHLEII0VQN5EAAlFsD1xL06Pf1xrq2ee+//37cOeeck79v3770rKys9P3796/r3bt31Zw5czqefvrpJRs2bGj/+uuvd73gggvyASZMmHBo6dKlnXJzc81Wq5XZs2e7nYzz888/d8jNzTUDVFRUqIyMjHZJSUlVp556avG3334bt3//fjM4kjCAMWPGHHrjjTfiAF599dX4tLS00rp1xsfHG717965666234gAMw2Dx4sXRdcsdffTRJW+//XYXcIxliouLs8XHx/uVwLkzZcqUwrfeeqsLwNtvvx13zDHHlJhMJqZNm1b45ZdfxpeXl6vNmzdHZmZmtps0adKhmudOmjTp0IoVKzq6xvsUFxeb1q1bF+V63TUg/c0334wbM2ZMrXPtdjvbt2+PPPPMM0tefvnlrNLSUnNRUZHZ0/scN25cyTvvvNMF4LPPPospLi42A5x22mnF3333XVxWVpYFHPc+IyMjMjs722K327nyyisLH3/88az09HS/u2SD3hKkHE0+bwKbtNbP1njpG2A68ITz++xgxyKEEIFg9neuuwi4zz//PP6uu+7aX/PY2WefXfDBBx/ET548ufTEE08s+uKLL7p89tlnmQD9+/e33n777dlpaWlDY2NjbYMGDaqIjY21A3z44Yexy5cv7/D888/vy8jIaHfTTTf1AzAMQ5100klF06dPLzCZTNxxxx3Zxx13XIrJZNIjRowomzVrVubMmTN3X3HFFUkvvPBC9y5dutjee++9THfxfvzxxzuuvfbafk8++WQPm82mzjnnnPxjjjmm1pikJ598ct+ll16alJycPCw6Otp455133La+eHL99df3/uqrr+IrKipMiYmJoy699NK8Z599dt+tt96aN23atP59+/YdERsba//000+3A6SlpVVMnTo1Pzk5ebjZbObZZ5/dZbHUTgt69uxpe/XVVzMvuuiiAVVVVQrgwQcfzBo1alQlQEFBgTk5OXlYZGSk/uSTT3bUPNdms6lLLrmkf0lJiVlrra655poDXbt2tXt6n0888cS+adOmDRg0aNDwtLS00h49elQBjB07tuL+++/POvHEE5MNwyAiIkK/+OKLu9u3b29cffXV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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "print('length of scores: ', len(scores), ', len of avg_scores: ', len(avg_scores))\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111)\n",
    "plt.plot(np.arange(1, len(scores)+1), scores, label=\"Score\")\n",
    "plt.plot(np.arange(1, len(avg_scores)+1), avg_scores, label=\"Avg.Score on 100 episodes\")\n",
    "## plt.plot(np.arange(1, len(avg_numm_steps)+1), avg_numm_steps, label=\"Avg.Num.Steps on 100 episodes\")\n",
    "plt.legend(bbox_to_anchor=(1.05, 1)) \n",
    "plt.ylabel('Score')\n",
    "plt.xlabel('Episodes #')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl8AAAEGCAYAAABb1vC/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABR3UlEQVR4nO3dd5hU5fXA8e/Z3nuhLMvSl96xoVGxUFQUgyWJYonG/DS2JIIpRk1RY4uaqFFR0RgrGntXBMQGSJW2wFIWtvfe3t8fc2eZXZbd2d1py5zP88yzd+7cuffMLMyeect5xRiDUkoppZTyjABvB6CUUkop5U80+VJKKaWU8iBNvpRSSimlPEiTL6WUUkopD9LkSymllFLKg4K8HUBPJCUlmYyMDG+HoZRSvcqaNWsKjTHJ3o5DKX/Vq5OvjIwMVq9e7e0wlFKqVxGRPd6OQSl/pt2OSimllFIepMmXUkoppZQHafKllFJKKeVBvXrMl1JKKd+xZs2alKCgoKeAMeiXe+XfmoFNjY2NP588eXJ+2wc1+VJKKeUSQUFBT/Xp02dkcnJySUBAgC4crPxWc3OzFBQUjMrNzX0KOKft4/rNRCmllKuMSU5OLtfES/m7gIAAk5ycXIatFfjwxz0cj1JKqaNXgCZeStlY/xfazbP8Nvn6YnsB+4qrvR2GUkoppfyM3yZfC57+llPvX+btMJRSSrnY888/Hycik7///vswV5zvnXfeiRaRyf/9739j7ftOOeWUoe+88060K87vaP369aHTpk0bkZmZOWrw4MGjL7744oEAq1atCn/55ZdjO3u+N5144onDoqOjJ5xyyilDHfdv3bo1ZNy4cZnp6elj5syZM7i2tlYAampqZM6cOYPT09PHjBs3LnPbtm0hrojjwgsvHLhmzZoe/e63bdsWMmzYsNGuiKc9fpt8ATQ0aeu4Uqp3qW1o4q73t7BuX6m3Q/FZL730UsKkSZMqn3vuuQRXnTM1NbXhnnvu6euq8x3Jtddem3799dfnbd269Yddu3Ztvummm/IBVq9eHfHuu+/6dPL1m9/8Jvff//737rb7b7755rTrrrsub+/evZtiY2MbH3rooSSAhx56KCk2NrZx7969m6677rq8m2++Oc0Vcbz88st7Jk+eXOuKc7mLW5MvEblJRDaLyCYReVFEwkRkkIh8IyJZIvKyiIRYx4Za97OsxzPcGZtSSvVGhZV1/PuLXWzLLfd2KD6prKws4Lvvvot65plnst94440EgNdeey1m1qxZg+3HvPPOO9H21pkHH3wwKSMjY8zYsWNHXnTRRQMvvfTS9PbOO3LkyOro6OimN954I6btY/379x978ODBIIDly5dHTJs2bQTAzTff3G/evHkZkydPHtGvX7+xS5YsibvmmmvShg8fPurEE08cVldXJ23PlZ+fHzxw4MB6+/1p06bV1NbWyl133dXv7bffjs/MzBz15JNPxpeXlwfMnz8/Y+zYsSNHjhw56j//+U8cwMMPP5w4Y8aMIdOmTRsxcODAMb/+9a/7ApSXlwecfPLJQ0eMGDFq2LBho5988sn4ttdetWpV+Pjx4zOHDx8+6vTTTx9SUFAQaMUw4pe//GX/sWPHjszIyBjzwQcfRLX3Hs2dO7ciJiam2XFfc3MzX331VfTll19eAnDFFVcUvf3223HW7yHuiiuuKAK4/PLLS1atWhXd3Nx82Hn/+Mc/po4ZM2bk8OHDR9100039wNYyNWjQoNHnnHPOoMGDB4+eOXPm4IqKigB7vMuXL49obGzk/PPPzxg2bNjo4cOHj7rjjjtSOnqdK1asiBgxYsSoESNGjHrggQdS7NdvbGzkF7/4RZo9hnvvvTcJYM+ePcFTpkwZkZmZOWrYsGGjj/S+tMdtpSZEpD9wPTDKGFMjIq8AFwGzgQeNMS+JyOPAlcBj1s8SY8xQEbkIuAe40F3xKaVUb1RS1QBAfIRLemjc5revrR+wPbciwpXnHN4nuvreH4/f19Ex//3vf+NOPvnksnHjxtXFx8c3rlixImLu3Lnlv/rVrwaWl5cHxMTENL/44ovx8+fPL87Ozg6+7777+q5du/aHuLi45uOPP3746NGja4507t///vcHb7vttv7nnXee05nvnj17QletWrV97dq1YaeeemrmkiVLdj7++OP7Tz/99CGvvPJK7CWXXFLqePy1116bN3v27OETJ06smjFjRtm1115blJSU1HTrrbceWL16deRzzz23F+C6667rf8opp5S/+uqr2YWFhYFTpkwZec4555QDbNiwIXLjxo2bo6KimidOnDhq7ty5Zbt27Qrp06dPw7Jly7IAioqKAtvGetlllw168MEH986ZM6fyxhtv7Ldw4cJ+Tz/99D6AxsZG2bhx45aXX3459s47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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig2 = plt.figure()\n",
    "ax = fig2.add_subplot(111)\n",
    "# plt.plot(np.arange(1, len(scores)+1), scores, label=\"Score\")\n",
    "# plt.plot(np.arange(1, len(avg_scores)+1), avg_scores, label=\"Avg.Score on 100 episodes\")\n",
    "plt.plot(np.arange(1, len(avg_numm_steps)+1), avg_numm_steps, label=\"Avg.Num.Steps on 100 episodes\")\n",
    "plt.legend(bbox_to_anchor=(1.05, 1)) \n",
    "plt.ylabel('Num.Steps')\n",
    "plt.xlabel('Episodes #')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def play(env, agent, num_episodes):\n",
    "    \n",
    "    state = env.reset()\n",
    "    scores_deque = deque(maxlen=100)\n",
    "    scores = []\n",
    "    \n",
    "    for i_episode in range(num_episodes + 1):\n",
    "        \n",
    "        state = env.reset()\n",
    "        score = 0                    \n",
    "        time_start = time.time()\n",
    "        \n",
    "        while True:\n",
    "            \n",
    "            action = agent.select_action(state, eval=False)\n",
    "            env.render()\n",
    "            next_state, reward, done, _ = env.step(action)\n",
    "            score += reward \n",
    "            state = next_state\n",
    "    \n",
    "            if done:\n",
    "                break\n",
    "                \n",
    "        s = (int)(time.time() - time_start)\n",
    "        \n",
    "        scores_deque.append(score)\n",
    "        scores.append(score)    \n",
    "        \n",
    "        print('Episode {}\\tAverage Score: {:.2f},\\tScore: {:.2f} \\tTime: {:02}:{:02}:{:02}'\\\n",
    "                  .format(i_episode, np.mean(scores_deque), score, s//3600, s%3600//60, s%60)) \n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#import pybullet_envs.bullet.minitaur_gym_env as e\n",
    "#env_render = e.MinitaurBulletEnv(render=True)\n",
    "#play(env=env_render, agent=agent, num_episodes=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "env.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "ml2-kernel",
   "language": "python",
   "name": "ml2-kernel"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
